﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Rendiciones.Logica.Enumeradores;
using Rendiciones.Logica.Modelos;
using Rendiciones.Logica.Servicios;
using Rendiciones.Web.infraestructura;

namespace Rendiciones.Web.Gerente
{
    public partial class AprobacionDeRendicion : PageBase
    {
        int ede;
        private static ServGastos _servGastos;
        public Usuario usuario;
        public Rendicion rendicion;
        protected void Page_Load(object sender, EventArgs e)
        {
            Button btnYes = (Button)ctrlEditarGasto.FindControl("BtnGuardarGasto");
            btnYes.Click += new EventHandler(ctrlAgregarGasto_btnYes_Click);
            Button btnNo = (Button)ctrlEditarGasto.FindControl("BtnCancelarGasto");
            btnNo.Click += new EventHandler(ctrlAgregarGasto_btnNo_Click);
            usuario = (Usuario)Session["usuario"];
            if (usuario == null) Response.Redirect("~/IniciarSesion.aspx");

            if (!IsPostBack)
            {
                
                _servGastos = new ServGastos();
                DropDownList1.DataTextField = "Nombre";
                DropDownList1.DataValueField = "IdProyecto";
                
                var rendicionParaCargar = (string)Session["RendicionParaCargar"];
                rendicion = _servGastos.CargarRendicionPorId(int.Parse(rendicionParaCargar));
                //rendicion = Modulos.Rendiciones.Gastos.CargarRendicionPorId(int.Parse(rendicionParaCargar));
                rendicion.DetallesGasto = _servGastos.BuscarGastosDeRendicion(int.Parse(rendicionParaCargar));
                //rendicion.DetallesGasto = Modulos.Rendiciones.Gastos.BuscarGastosDeRendicion(int.Parse(rendicionParaCargar));
                CargarRendicionSolicitada(rendicion);
                Session["RendicionParaCargar"] = null;
                lblTotalPagado.Text = "Total a pagar : " + CalculaTotal().ToString();
            }
        }

        void ctrlAgregarGasto_btnYes_Click(object sender, EventArgs e)
        {
            CargarGrilla();
        }

        void ctrlAgregarGasto_btnNo_Click(object sender, EventArgs e)
        {
            Session["index"] = null;
        }
        
        protected void grRendicion_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            var index = int.Parse(e.CommandArgument.ToString());

            Session["index"] = index;

            if (e.CommandName == "Editar")
            {
                var gastos = (List<Gasto>)Session["datasource"];
                var gasto = gastos[index];
                ctrlEditarGasto.NroGasto = (index + 1).ToString();
                ctrlEditarGasto.CargaDatosAPopup(gasto);
            }

            if (e.CommandName == "Eliminar")
            {
                var dt = (DataTable)Session["objDT"];
                var sesionBorrar = (DataTable)Session["dtABorrar"];
                var idRendicion = dt.Rows[index]["IdRendicion"].ToString();
                if (!string.IsNullOrEmpty(idRendicion) && idRendicion != "0")
                {
                    if (sesionBorrar == null)
                    {
                        var dtABorrar = dt.Clone();

                        dtABorrar.Rows.Add(dt.Rows[index]);
                        Session["dtABorrar"] = dtABorrar;
                    }
                    else
                    {
                        sesionBorrar.Rows.Add(dt.Rows[index]);
                        Session["dtABorrar"] = sesionBorrar;
                    }
                }
                dt.Rows.RemoveAt(index);

            }


        }

        protected void grRendicion_SelectedIndexChanged(object sender, EventArgs e)
        {

        }


        private Rendicion TransformarARendicion()
        {
            var rendicion = new Rendicion();

            rendicion.IdProyecto = DropDownList1.SelectedIndex != -1 ? int.Parse(DropDownList1.SelectedValue) : 0;
            rendicion.CentroCosto = TextBox1.Text;
            rendicion.FondoAsignado = !string.IsNullOrEmpty(TextBox2.Text) ? int.Parse(TextBox2.Text) : 0;
            rendicion.Saldo = !string.IsNullOrEmpty(TextBox3.Text) ? int.Parse(TextBox3.Text) : 0;
            rendicion.DetallesGasto = new List<Gasto>();
            rendicion.GastosAEliminar = new List<Gasto>();

            var idRendicion = (int)Session["IdRendicion"];
            rendicion.IdRendicion = idRendicion != 0 ? idRendicion : rendicion.IdRendicion;
            Session["IdRendicion"] = null;

            rendicion.ComentariosSupervisor = txtComentariosSupervisor.Text;
            rendicion.ComentariosGerente = txtComentariosGerente.Text;

            rendicion.DetallesGasto = (List<Gasto>)Session["datasource"];
            var dtABorrar = (DataTable)Session["dtABorrar"];
            if (dtABorrar != null)
            {
                foreach (DataRow row in dtABorrar.Rows)
                {
                    var nuevoGasto = new Gasto();
                    //nuevoGasto.Archivo = new FileInfo();
                    nuevoGasto.Descripcion = row["Descripcion"].ToString();
                    //nuevoGasto.DvBeneficiario = row["IdProveedor"].ToString();
                    nuevoGasto.FechaDocumento = !string.IsNullOrEmpty(row["FechaDocumento"].ToString()) ? Convert.ToDateTime(row["FechaDocumento"].ToString()) : DateTime.MinValue;
                    nuevoGasto.GastoAsociado = !string.IsNullOrEmpty(row["IdTipoGastoAsoc"].ToString()) ? int.Parse(row["IdTipoGastoAsoc"].ToString()) : 0;
                    nuevoGasto.IdRendicion = !string.IsNullOrEmpty(row["IdRendicion"].ToString()) ? int.Parse(row["IdRendicion"].ToString()) : 0;
                    nuevoGasto.IdGasto = !string.IsNullOrEmpty(row["NroGasto"].ToString()) ? int.Parse(row["NroGasto"].ToString()) : 0;
                    nuevoGasto.Iva = !string.IsNullOrEmpty(row["IVA"].ToString()) ? int.Parse(row["IVA"].ToString()) : 0;
                    nuevoGasto.MontoNeto = !string.IsNullOrEmpty(row["MontoNeto"].ToString()) ? int.Parse(row["MontoNeto"].ToString()) : 0;
                    nuevoGasto.NroDocumento = !string.IsNullOrEmpty(row["NroDocumento"].ToString()) ? int.Parse(row["NroDocumento"].ToString()) : 0;
                    nuevoGasto.NroRendicion = !string.IsNullOrEmpty(row["IdRendicion"].ToString()) ? int.Parse(row["IdRendicion"].ToString()) : 0;
                    nuevoGasto.Retencion = !string.IsNullOrEmpty(row["Retencion"].ToString()) ? int.Parse(row["Retencion"].ToString()) : 0;
                    nuevoGasto.RutBeneficiario = row["RutProveedor"].ToString();
                    nuevoGasto.TipoDocumento = new TipoDocumento { IdDocumento = int.Parse(row["IdTipoDocumento"].ToString()) };
                    nuevoGasto.TipoGasto = new TipoGasto { IdGasto = int.Parse(row["IdTipoGasto"].ToString()) };
                    nuevoGasto.TotalPagado = !string.IsNullOrEmpty(row["TotalPago"].ToString()) ? int.Parse(row["TotalPago"].ToString()) : 0;
                    rendicion.GastosAEliminar.Add(nuevoGasto);
                }
            }
            return rendicion;
        }

        public void CargarRendicionSolicitada(Rendicion rendicion)
        {
            Session["IdRendicion"] = rendicion.IdRendicion;
            Session["datasource"] = rendicion.DetallesGasto;
            var proyectos = new List<Proyecto>();
            var proyecto = Modulos.Rendiciones.Proyectos.Leer(rendicion.IdProyecto);
            proyectos.Add(proyecto);
            DropDownList1.DataSource = proyectos;
            DropDownList1.DataBind();
            DropDownList1.SelectedIndex = rendicion.IdProyecto;
            TextBox1.Text = rendicion.CentroCosto;
            TextBox2.Text = rendicion.FondoAsignado.ToString();
            TextBox3.Text = rendicion.Saldo.ToString();
            lblTitulo.Text = "Rendicion Nro : " + rendicion.IdRendicion;
            lblUsuarioIngreso.Text = "Usuario Ingreso : " + rendicion.UsuarioIngreso;

            if (!string.IsNullOrEmpty(rendicion.ComentariosSupervisor))
            {
                var wf = Modulos.Rendiciones.WorkFlows.Obtener(rendicion.IdRendicion);
                if (wf != null && wf.Count > 0)
                    lblObservacionUsuario.Text = wf.FirstOrDefault().Responsable;
                txtComentariosSupervisor.Text = rendicion.ComentariosSupervisor;
                pnlComentariosSupervisor.Visible = true;
            }

            grRendicion.DataSource = rendicion.DetallesGasto;
            grRendicion.DataBind();

        }

        protected void btnAgregarComentario_Click(object sender, EventArgs e)
        {
            txtComentariosGerente.Visible = true;
        }

        protected void btnAprobar_Click(object sender, EventArgs e)
        {
            var rendicion = TransformarARendicion();
            Modulos.Rendiciones.WorkFlows.Salida(rendicion.IdRendicion, EEstadoRendicion.RevisionDeGerente, DateTime.Now);

            rendicion.Estado = EEstadoRendicion.DeclaracionDeRendicionPorCustodio;
            _servGastos.IngresarRendicion(ref rendicion);

            var proyecto = Modulos.Rendiciones.Proyectos.Leer(rendicion.IdProyecto);
            Modulos.Rendiciones.WorkFlows.Entrada(rendicion.IdRendicion, EEstadoRendicion.DeclaracionDeRendicionPorCustodio,
                                                  DateTime.Now, proyecto.IdAdministrador, UsuarioConectado.IdUsuario);
            
            
            MostrarOk("Rendicion Aprobada Satisfactoriamente", "~/Gerente/Menu.aspx");
        }

        protected void btnRechazar_Click(object sender, EventArgs e)
        {
            var rendicion = TransformarARendicion();
            Modulos.Rendiciones.WorkFlows.Salida(rendicion.IdRendicion, EEstadoRendicion.RevisionDeGerente, DateTime.Now);

            rendicion.Estado = EEstadoRendicion.RechazadoParaRevision;
            _servGastos.IngresarRendicion(ref rendicion);

            var proyecto = Modulos.Rendiciones.Proyectos.Leer(rendicion.IdProyecto);
            Modulos.Rendiciones.WorkFlows.Entrada(rendicion.IdRendicion, EEstadoRendicion.RechazadoParaRevision,
                                                  DateTime.Now, proyecto.IdAdministrador, UsuarioConectado.IdUsuario);
            
            MostrarOk("Rendicion Rechazada Satisfactoriamente", "~/Gerente/Menu.aspx");
        }

        public void CargarGrilla()
        {

            var gastosIngresados = (List<Gasto>)Session["datasource"];

            var gastos = new List<Gasto>();
            var gasto = ctrlEditarGasto.GastoIngresado;
            if (gastosIngresados == null)
            {
                gastos.Add(gasto);
                grRendicion.DataSource = gastos;
                grRendicion.DataBind();
                Session["datasource"] = gastos;
            }
            else
            {

                if (Session["index"] != null)
                {
                    var index = (int)Session["index"];
                    gastosIngresados[index] = gasto;
                }
                else
                {
                    gastosIngresados.Add(gasto);
                }


                grRendicion.DataSource = gastosIngresados;
                grRendicion.DataBind();
                Session["datasource"] = gastosIngresados;

            }
            Session["index"] = null;

            lblTotalPagado.Text = CalculaTotal().ToString();
        }

        public int CalculaTotal()
        {
            var listadoGastos = (List<Gasto>)Session["datasource"];
            var totalGastos = listadoGastos.Sum(gasto => gasto.TotalPagado);
            return totalGastos;
        }

        protected void btnCancelar_Click(object sender, EventArgs e)
        {
            BorrarSesiones();
            Response.Redirect("PendientesDeAprobacion.aspx");
        }

        private void BorrarSesiones()
        {
            Session["index"] = null;
            Session["datasource"] = null;
            Session["IdRendicion"] = null;
            Session["RendicionParaCargar"] = null;
        }

    }
}